#include <iostream>
#include <functional>
#include <unordered_map>
#include "../../../../include/muduo/net/TcpServer.h"
#include "../../../../include/muduo/net/EventLoop.h"
#include "../../../../include/muduo/net/TcpConnection.h"
using namespace std;

class TranslateServer
{
public:
    TranslateServer(int port) //要绑定的端口
        : _server(&_baseloop, muduo::net::InetAddress("0.0.0.0", port),
         "TcpServer", muduo::net::TcpServer::Option::kReusePort) //启动地址重用
    {
        auto fun1 = bind(&TranslateServer::onConnection, this, std::placeholders::_1);
        _server.setConnectionCallback(fun1);  //不能直接设置为onConnection函数，因为包含一个隐藏的this指针
        auto fun2 = bind(&TranslateServer::onMessage, this, std::placeholders::_1, 
            std::placeholders::_2, std::placeholders::_3);
        _server.setMessageCallback(fun2);     //不能直接设置为onMessage函数，因为包含一个隐藏的this指针
    }

    void start()
    {
        _server.start();  //开始事件监听
        _baseloop.loop(); //开始事件监控（是一个死循环）
    }

private:
    //新连接建立成功时的回调函数
    void onConnection(const muduo::net::TcpConnectionPtr& conn)
    {
        //该函数在建立连接和关闭连接时都会被调用
        if (conn->connected())
        {
            cout << "连接建立成功！" << endl;
        }
        else 
        {
            cout << "关闭连接" << endl;
        }
    }

    string translate(const string& word)
    {
        static unordered_map<string, string> dict = {
            {"hello", "你好"},
            {"sun", "太阳"},
            {"left", "左"}
        };

        auto it = dict.find(word);
        if (it != dict.end())
        {
            return it->second;
        }
        else 
        {
            return "查找失败";
        }
    }

    //收到请求时的回调函数
    void onMessage(const muduo::net::TcpConnectionPtr& conn, muduo::net::Buffer* buf, muduo::Timestamp)
    {
        //1.将缓冲区的数据读取出来放到word中
        string word = buf->retrieveAllAsString();
        //2.通过内置词典，翻译word对应的中文
        string res = translate(word);
        //3.将翻译的结果返回给客户端
        conn->send(res);
    }

private:
    muduo::net::EventLoop _baseloop;
    muduo::net::TcpServer _server;
};

int main()
{
    TranslateServer server(8080);
    server.start();

    return 0;
}
